#include <iostream>
#include <signal.h>
#include <unistd.h>

void PrintPending(sigset_t& pending)
{
    std::cout << "pending:";
    for(int i = 31; i >= 1; i--)
        std::cout << sigismember(&pending, i);
    std::cout << std::endl;
}
void PrintBlock(sigset_t& block)
{
    std::cout << "blocked:";
    for(int i = 31; i >= 1; i--)
        std::cout << sigismember(&block, i);
    std::cout << std::endl;
}
//实验2：操作系统会自动屏蔽当前正在处理的信号
void handler(int signo)
{
    std::cout << "signo：" << signo << " pid：" << getpid() << std::endl;
    sigset_t pending;

    sigset_t blocked;
    sigemptyset(&blocked);
    while(1)
    {
        sigprocmask(SIG_BLOCK, NULL, &blocked);
        PrintBlock(blocked);
        sigpending(&pending);
        PrintPending(pending);
        // sleep(1);
        sleep(1);
    }
}
int main()
{
    struct sigaction act, oact;
    act.sa_handler = handler;
    sigemptyset(&act.sa_mask);
    sigaddset(&act.sa_mask, 3);
    // sigaddset(&act.sa_mask, 2);
    // sleep(10);
    sigaction(2, &act, &oact);

    while(true)
    {
        sleep(1);
    }
}

//实验1：和signal一样的行为
// void handler(int signo)
// {
//     std::cout << "signo" << signo << "pid" << getpid() << std::endl;
// }
// int main()
// {
//     struct sigaction act, oact;
//     act.sa_handler = handler;
//     sigaction(2, &act, &oact);

//     while(true)
//     {
//         sleep(1);
//     }
// }